// 缓存原生的数组 prototype, 再重写 7 个方法 push,pop,shift,unshift,reverse,sort,splice
const oldArrayPrototype = Array.prototype;
const arrayPrototype = Object.create(oldArrayPrototype);
const methods = [
  "push",
  "pop",
  "shift",
  "unshift",
  "reverse",
  "sort",
  "splice",
];

methods.forEach((method) => {
  arrayPrototype[method] = function (...args) {
    // console.log("为了劫持数组方法，重写数组的方法，：", method);

    const ob = this.__ob__;

    let inserted;
    // 如果是用户向数组中添加对象，也需要观测，变成响应式的
    switch (method) {
      case 'push':
      case 'unshift':
        inserted = args;
        break;
      case 'splice':
        inserted = args.slice(2); // 这里切片是因为 splice 有三个参数，不需要前两个参数，取第三个即可
        break;
      default: break;
    }
    // 如果是用户向数组中添加对象，也需要观测，变成响应式的
    if (inserted) {
      // 观测用户为数组添加的对象数据
      ob.observeArray(inserted);
    }
    // 调用数组原生的方法
    oldArrayPrototype[method].call(this, ...args);
  };
});

export default arrayPrototype;
